BackForward

/*-------------------<-- Start of Description-->---------------------\
| Print out a manual for the function specified;                     |
| Note: The user defined macros must be saved under SASauto path (the|
|       path must be in the format of "C:...\MyOwnSetting\sasmacro\";|
|---------------------<-- End of Description-->----------------------|
|--------------------------------------------------------------------|
|-----------<-- Start of Files or Arguements Needed-->---------------|
| Arguments:                                                         |
|   function - the name of the function you want help with;          |
|   Note: Only User defined sas macros have manuals;                 |
|-----------------<-- End of Arguements Needed-->--------------------|
|--------------------------------------------------------------------|
|------------------<-- Start of Files Created-->---------------------|
| Example: %help(genreadme);                                         |
| Usage:   %help(function);                                          |
\-------------------<-- End of Files Created-->---------------------*/
%macro help/parmbuff;
/*--------------------------------------------\
| Copy Right: Duo Zhou;                       |
| Created:  12-25-2001 2:13pm;                |
| Modified: 12-25-2001 10:14am;               |
| Purpose:  print a manual for user defined   |
|           function;                         |
\--------------------------------------------*/
%local _linesize _pagesize ndir dir mydir directory ddir dirrc psid dirrf _tmplast_;
%let _tmplast_=&syslast; %let function=; %let keyword=;
%let _linesize = %SYSFUNC(GETOPTION(linesize)); %let _pagesize = %SYSFUNC(GETOPTION(pagesize));
options ps=1024 ls=256 nocenter;
%let syspbuff=%sysfunc(translate(%quote(%substr(%quote(%trim(%quote(%left(%quote(&syspbuff))))), 2, %eval(%length(%trim(%quote(%left(%quote(&syspbuff)))))-2))), %str(%'), %str(%")));
%let _helpcnt_=0;
%do %while(%length(%nrbquote(%scan(%nrbquote(&syspbuff), %eval(&_helpcnt_+1), %nrbquote(,)))));
   %let _helpcnt_=%eval(&_helpcnt_+1);
   %let _helpword_=%nrbquote(%qscan(%nrbquote(&syspbuff), &_helpcnt_, %nrbquote(,)));
   %if (&_helpcnt_=1) %then %let function=&_helpword_;
   %else %let keyword=&_helpword_;
%end;
%let function=%sysfunc(dequote(&function)); %let file=%trim(%left(&function)).sas;
%put --> Note: Looking for manuals (&file) for function &function..;
%let sasatpth=%sysfunc(pathname(sasautos));
%let ndir=1; %let dir=%qscan(&sasatpth, &ndir, %str(()''"")); %let directory=;
%if (%index(%upcase(&dir),%quote(:\))) %then %do;
   %let mydir=&dir;
   %if (%quote(%substr(&mydir, %length(&mydir), 1)) ne %quote(\)) %then %do;
      %let mydir=&mydir.\;
      %if (%sysfunc(fileexist(&mydir.&file))) %then %do;
         %let directory=&mydir;
      %end;
   %end;
%end;
%do %while(%length(&dir)>0);
   %let ndir=%eval(&ndir+1);
   %let dir=%qscan(&sasatpth, &ndir, %str(()''""));
   %if (%index(%upcase(&dir),%quote(:\))) %then %do;
      %let mydir=&dir;
      %if (%quote(%substr(&mydir, %length(&mydir), 1)) ne %quote(\)) %then %do;
         %let mydir=&mydir.\;
         %if (%sysfunc(fileexist(&mydir.&file))) %then %do;
            %let directory=&mydir;
         %end;
      %end;
   %end;
%end;
%if (%quote(&directory) ne) %then %do;
   %put --> Note: User defined sas macros are saved under: ;
   %put -->       "&directory".;
%end;
%else %do;
   %put ==> Alert! Cannot  find manuals for function &function..;
   %goto finish;
%end;
%let ddir=%substr(&directory, 1, %eval(%length(&directory)-1));
%let dirrc=%sysfunc(filename(dirrf,&directory)); %let psid=%sysfunc(DOPEN(&dirrf));
%if &psid %then %do;
   %let dirrc=%sysfunc(DCLOSE(&psid));
   %let dirrc=%sysfunc(filename(dirrf));
   /** Get some information available only to sas system **/
   data _tmp2;
      length foption $ 200 charval $ 400;
      keep memname foption charval;
      rc=filename("mydir","&directory");
      did=dopen("mydir");
      memcount=dnum(did);
      do i=1 to memcount;
         memname=dread(did,i);
         rc=FILENAME("myfile", "&directory"||trimn(left(memname)));
         fid = FOPEN("myfile");                 /* open file       */
         foption=" ";
         charval=" ";
         if fid>0 then do;
            numopts=FOPTNUM(fid);  /* get number of information items */
            do k=1 to numopts;
               option = FOPTNAME(fid,k);
               if trim(left(foption)) ne " " then do;
                  foption = trimn(left(foption))||", "||option;
                  if not index(upcase(FINFO(fid,upcase(option))), upcase("&ddir")) then do;
                     if trim(left(charval)) ne " " then
                        charval  = trimn(left(charval))||", "||FINFO(fid,upcase(option));
                     else charval  = FINFO(fid,upcase(option));
                  end;
               end;
               else do;
                  foption = option;
                  if not index(upcase(FINFO(fid,upcase(option))), upcase("&ddir")) then
                     charval  = FINFO(fid,upcase(option));
               end;
            end;
         end;
         else do;
            numopts=doptnum(did);
            if not missing(numopts) then do;
               do k=1 to numopts;
                  option=doptname(did,k);
                  if trim(left(foption)) ne " " then do;
                     foption = trimn(left(foption))||", "||option;
                     if not index(upcase(dinfo(did,upcase(option))), upcase("&ddir")) then do;
                        if trim(left(charval)) ne " " then
                           charval=trimn(left(charval))||", "||dinfo(did,upcase(option));
                        else charval  = FINFO(fid,upcase(option));
                     end;
                  end;
                  else do;
                     foption = option;
                     if not index(upcase(dinfo(did,upcase(option))), upcase("&ddir")) then
                        charval  = dINFO(did,upcase(option));
                  end;
               end;
            end;
         end;
         rc = FCLOSE(fid);                      /* close file      */
         rc = FILENAME("myfile");
         if indexw(upcase(foption), 'DIRECTORY') then memname=trimn(left("<"||memname))||">";
         output;
      end;
      label memname="Member Name" foption="Member Type" charval="Member Info";
   run;
   proc sort data=_tmp2 out=_dirtmp; by memname; run;
   proc datasets library=work nolist;
        delete _tmp1 _tmp2;
   run;quit;
   data _tmp3;
      set _dirtmp;
      if indexw(upcase(memname), upcase("&file"));
   run;
   %if %nobs(_tmp3) %then %do;
      DATA _tmp4;
         length fileloc $ 300 line $ 200;
         set _tmp3;
         by memname;
         line='';
         fileloc="&directory"||trim(left(memname));
         infile dummy length=linelen filename=memname end=done filevar=fileloc;
         do while((not done) %if (^%index(%upcase(&keyword), A)) %then and (index(line, ';') ne length(line)););
            input @1 line $ varying200. linelen; put line=;
            output;
         end;
         keep line;
         label line='Help';
      run;
      proc print data=_tmp4 noobs label;
      title "The Manual For Function %nrstr(%%)&function:";
      run; title " ";
      proc datasets library=work nolist;
           delete _tmp4;
      run;quit;
   %end;
   %else %do;
      %put ==> Alert! Can not find function "&function", please provide a valid function name!;
   %end;
   proc datasets library=work nolist;
        delete _dirtmp _tmp3;
   run;quit;
%end;
%else %put ==> Alert! The directory "directory" does%str(%')t exist.;
%finish:
options ps=&_pagesize ls=&_linesize;
%let syslast=&_tmplast_;
%mend help;